package com.bjpowernode.controller;

import com.bjpowernode.entity.TClue;
import com.bjpowernode.query.ClueQuery;
import com.bjpowernode.result.Result;
import com.bjpowernode.service.ClueService;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/**
 * 线索管理控制器
 * 负责处理线索相关的HTTP请求，包括查询、新增、修改等操作
 */
@RestController
public class ClueController {
    /**
     * 线索服务层对象
     * 用于调用线索相关的业务逻辑方法
     */
    @Resource
    private ClueService clueService;

    /**
     * 分页查询线索列表
     * @param current 当前页码
     * @return 包含分页线索信息的Result对象
     */
    @GetMapping("/api/clues")
    public Result getClueByPage(Integer current) {
        PageInfo<TClue> pageInfo = clueService.getClueByPage(current);
        return Result.OK(pageInfo);
    }

    /**
     * 根据ID查询线索详情
     * @param id 线索ID
     * @return 包含线索详情的Result对象
     */
    @GetMapping("/api/clue/{id}")
    public Result getClueById(@PathVariable Integer id) {
        // 调用线索服务根据ID查询线索详情
        TClue tClue = clueService.getClueById(id);
        // 返回成功响应，包含线索详情
        return Result.OK(tClue);
    }

    /**
     * 新增线索
     * @param clueQuery 线索新增请求参数（已校验）
     * @return 包含新增结果的Result对象（影响行数为1时成功）
     */
    @PostMapping("/api/clue")
    public Result addClue(@Valid ClueQuery clueQuery) {
        // 调用线索服务添加新线索
        int count = clueService.addClue(clueQuery);
        // 返回成功响应，包含影响行数
        return count == 1 ? Result.OK(count) : Result.FAIL();
    }

    /**
     * 修改线索信息
     * @param clueQuery 线索修改请求参数
     * @return 包含修改结果的Result对象（影响行数为1时成功）
     */
    @PutMapping("/api/clue")
    public Result editClue(ClueQuery clueQuery) {
        // 调用线索服务编辑线索信息
        int count = clueService.editClue(clueQuery);
        // 返回成功响应，包含影响行数
        return count == 1 ? Result.OK(count) : Result.FAIL();
    }

    /**
     * 根据ID删除线索
     * @param id 要删除的线索ID
     * @return 包含删除结果的Result对象（影响行数为1时成功）
     */
    @DeleteMapping("/api/clue/{id}")
    public Result deleteClue(@PathVariable Integer id) {
        // 调用线索服务删除指定ID的线索
        int count = clueService.deleteClue(id);
        // 返回成功响应，包含影响行数
        return count == 1 ? Result.OK(count) : Result.FAIL();
    }

    /**
     * 批量删除线索
     * @param ids 线索ID字符串，多个ID用逗号分隔（如："1,2,3"）
     * @return 包含批量删除结果的Result对象（实际删除数量等于请求数量时成功）
     */
    @DeleteMapping("/api/clues")
    public Result deleteClues(@RequestParam("ids") String ids) {
        // 将逗号分隔的线索ID字符串转换为List集合
        List<String> list = Arrays.asList(ids.split(","));
        // 调用线索服务层批量删除线索，返回实际删除的数量
        int count = clueService.deleteClues(list);
        // 返回成功响应，包含删除的线索数量
        // 如果实际删除数量等于请求删除数量，则返回成功；否则返回失败
        return count == list.size() ? Result.OK(count) : Result.FAIL();
    }

    /**
     * Excel线索导入接口
     * 接收前端上传的Excel文件，调用服务层完成线索数据的解析与批量导入
     * @param multipartFile 上传的Excel文件（MultipartFile格式）
     * @return Result对象，成功时返回OK状态（无业务数据）
     * @throws  当获取文件输入流失败时抛出（如文件损坏、读取权限不足等）
     */
    @PostMapping("/api/importExcel")
    public Result importClue(@RequestParam("excelFile") MultipartFile multipartFile) throws IOException {
        // 调用服务层导入方法，传入文件输入流进行处理
        clueService.importExcel(multipartFile.getInputStream());
        // 返回导入成功结果
        return Result.OK();
    }
}
